// 引入必要的命名空间
using Microsoft.AspNetCore.Mvc; // 提供MVC控制器和ActionResult支持
using UniversalAdmin.Application.DTOs; // 引入数据传输对象定义
using UniversalAdmin.Application.Services; // 引入服务层接口和实现

// 定义控制器的命名空间
namespace UniversalAdmin.Api.Controllers
{
    // 标记该类为API控制器
    [ApiController]
    // 定义路由模板，v1表示API版本，[controller]会自动替换为控制器名称
    [Route("api/v1/[controller]")]
    // 继承自ControllerBase，提供基础的控制器功能
    public class RoleController : ControllerBase
    {
        // 注入角色服务接口
        private readonly IRoleService _roleService;

        // 构造函数，依赖注入IRoleService
        public RoleController(IRoleService roleService)
        {
            _roleService = roleService;
        }

        // HTTP GET方法，获取所有角色
        [HttpGet]
        public async Task<IActionResult> GetAllRoles()
        {
            // 调用服务层获取所有角色
            var roles = await _roleService.GetRolesAsync();
            // 返回200 OK响应，包含角色列表
            return Ok(roles);
        }

        // HTTP GET方法，根据ID获取单个角色
        [HttpGet("{id}", Name = "GetRoleById")]
        public async Task<IActionResult> GetRoleById(Guid id)
        {
            // 调用服务层根据ID获取角色
            var role = await _roleService.GetRoleByIdAsync(id);
            // 如果角色不存在，返回404 Not Found响应
            if (role == null)
                return NotFound(new { message = "角色不存在" });
            // 返回200 OK响应，包含角色信息
            return Ok(role);
        }

        // HTTP POST方法，创建新角色
        [HttpPost]
        public async Task<IActionResult> CreateRole([FromBody] CreateRoleDto dto)
        {
            // 调用服务层创建角色
            var role = await _roleService.CreateRoleAsync(dto);
            // 返回201 Created响应，包含新角色的URI和角色信息
            return CreatedAtRoute("GetRoleById", new { id = role.Id }, role);
        }

        // HTTP PUT方法，更新角色
        [HttpPut("{id}")]
        public async Task<IActionResult> UpdateRole(Guid id, [FromBody] UpdateRoleDto dto)
        {
            // 调用服务层更新角色
            var updatedRole = await _roleService.UpdateRoleAsync(id, dto);
            // 如果角色不存在，返回404 Not Found响应
            if (updatedRole == null)
                return NotFound(new { message = "角色不存在" });
            // 返回200 OK响应，包含更新后的角色信息
            return Ok(updatedRole);
        }

        // HTTP DELETE方法，删除角色
        [HttpDelete("{id}")]
        public async Task<IActionResult> DeleteRole(Guid id)
        {
            // 调用服务层删除角色
            var success = await _roleService.DeleteRoleAsync(id);
            // 如果删除成功，返回204 No Content响应；否则返回404 Not Found响应
            return success ? NoContent() : NotFound(new { message = "角色不存在" });
        }

        // HTTP POST方法，为角色分配权限
        [HttpPost("{roleId}/permissions")]
        public async Task<IActionResult> AssignPermissions(Guid roleId, [FromBody] List<Guid> permissionIds)
        {
            try
            {
                // 调用服务层为角色分配权限
                await _roleService.AssignPermissionsAsync(roleId, permissionIds);
                // 返回204 No Content响应，表示操作成功
                return NoContent();
            }
            catch (Exception ex)
            {
                // 如果发生异常，返回400 Bad Request响应，包含错误信息
                return BadRequest(new { message = "分配权限失败", detail = ex.Message });
            }
        }
    }
}